﻿/*
* Stwórz element który będzie twoim preloaderem
* OPCJE:
            'percent-bar': '.percent-bar',                      - jquery path do elementu, paska postępu który w trakcie ładowania będzie miał ustawiane width od 0% do 100%
            'percent-val-with-zero': '.percent-val-lz',         - jquery path do elementu w którym będzie ustawiany text dla ukończono z zerem wiodącym
            'percent-val': '.percent-val',                          - jquery path do elementu w którym będzie ustawiany text dla ukończono z zerem wiodącym
            'fix-timeout': 30000,                                       - timeout, jeżeli coś pójdzie nie tak
            'call-afterload': function () { }                       - callback function, po zakończeniu ładowania
*/

(function ($) {
    $.fn.preloadPage = function (options) {

        if ((typeof (disablePreloader) != 'undefined' && disablePreloader != true) || navigator.userAgent.match(/MSIE (\d+(?:\.\d+)+(?:b\d*)?)/) == "MSIE 6.0,6.0") { // wyłączenie
            $('body').css('overflow', '');
            this.hide();
            return this;
        }

        var $settings = $.extend({
            'percent-bar': '.percent-bar',
            'percent-val-with-zero': '.percent-val-lz',
            'percent-val': '.percent-val',
            'fix-timeout': 30000,
            'call-afterload': function () { }
        }, options);

        var $this = this;
        var $percentBar = this.find($settings['percent-bar']);
        var $percentValWithZero = this.find($settings['percent-val-with-zero']);
        var $percentVal = this.find($settings['percent-val']);

        this.show();
        $('body').css('overflow', 'hidden');

        var $preloaderItems = new Array();
        $('body').find("*:not(script)").each(function () {
            var url = "";

            if ($(this).css("background-image") != "none" && $(this).css("background-image").indexOf('url') >= 0) {
                var url = $(this).css("background-image");
            } else if (typeof ($(this).attr("src")) != "undefined" && $(this).is('img')) {
                var url = $(this).attr("src");
            }

            url = url.replace("url(\"", "");
            url = url.replace("url(", "");
            url = url.replace("\")", "");
            url = url.replace(")", "");

            if (url.length > 0) {
                $preloaderItems.push(url);
            }
        });

        var $preloader = $("<div></div>"); // tworzymy kontener dla ponownego załadowania obrazków. Obrazki będą niewidoczne, a tylko tak mamy pewność "wywalenia" zdarzenia load
        $preloader.appendTo($('body'));
        $preloader.css({
            height: "0px",
            width: "0px",
            overflow: "hidden"
        });

        var $doneNow = 0;

        $($preloaderItems).each(function (i, src) {
            var $img = $('<img></img>');
            $img.load(function () {
                $doneNow++;

                var perc = Math.ceil((100 / $preloaderItems.length) * $doneNow);
                if (perc > 100) perc = 100;
                $percentBar.css('width', perc + '%');
                $percentVal.text(perc);
                perc = '' + perc;
                if (perc.length == 1)
                    perc = '0' + perc;
                $percentValWithZero.text(perc);

                if ($doneNow == $preloaderItems.length) {// załadowano wszystkie obrazki
                    $('body').css('overflow', '');
                    $preloader.remove();
                    $this.fadeOut(1000, function () { $this.hide(); });
                    $settings['call-afterload']();
                }
            }).attr('src', src);
            $img.appendTo($preloader);
        });

        // jak coś się walnie daj timeouta dla wyłączenia preloadera
        var $uniId = 'preloader-';
        $uniId = $uniId + Math.ceil(Math.random() * 1000000);
        $this.addClass($uniId);
        $preloader.addClass('fake-' + $uniId);
        window.setTimeout("window.fixPreloader('" + $uniId + "');", $settings['fix-timeout']);
        window.fixPreloader = function (fixClassId) {
            $('body').css('overflow', '');
            $('.' + $uniId).hide();
            $('.fake-' + $uniId).remove();
            $settings['call-afterload']();
        }

    };
})(jQuery);